#pragma once
#include <cstdlib>
#include <sys/epoll.h>
#include <unistd.h>

class Epoll
{
    static const int gsize=256;
    static const int gtimeout=5000;
private:
    int _epfd;
    int _timeout;
public:
    Epoll(int timeout=gtimeout):_epfd(-1),_timeout(timeout)
    {

    }

    // 创建
    void CreateEpoll() 
    {
        _epfd=epoll_create(gsize);
        if(_epfd<0)
        {
            exit(6);
        }
    }

    // 添加
    bool AddSockToEpoll(int sockfd,uint32_t events)
    {
        struct epoll_event ev;
        ev.events=events;
        ev.data.fd=sockfd;

        int ret=epoll_ctl(_epfd,EPOLL_CTL_ADD,sockfd,&ev);

        return 0==ret;
    }

    // 修改
    bool ModSockEvents(int sockfd,uint32_t events)
    {
        // 保证epoll处于ET工作模式
        events|=EPOLLET;

        struct epoll_event ev;
        ev.data.fd=sockfd;
        ev.events=events;

        int res=epoll_ctl(_epfd,EPOLL_CTL_MOD,sockfd,&ev);

        return 0==res;
    }

    bool DelFromEpoll(int sockfd)
    {
        return 0==epoll_ctl(_epfd,EPOLL_CTL_DEL,sockfd,nullptr);
    }

    int WaitEpoll(struct epoll_event revs[],int revs_num)
    {
        return epoll_wait(_epfd,revs,revs_num,_timeout);
    }

    ~Epoll()
    {
        if(_epfd>=0)
        {
            close(_epfd);
        }
    }
};